# Perfeccionista Environment

Для чего нужна эта библиотека?

> Для удобства управления объектами и настройками, используемыми в тестах
> и для возможности конфигурирования этих объектов и настроек на уровне:
> теста/тестового класса/группы тестовых классов/потока.
{style="note"}

Если вы пишете простые unit-тесты, эта библиотека, скорее всего, вам не нужна.
Однако, когда вы пишете тесты со сложными проверками или тестируете сложные системы,
у вас появляется необходимость использования вспомогательных сущностей и сервисов.

Например, если вам необходимо тестировать какие-то системы, требующие авторизации,
то вы можете, конечно, авторизовываться в начале каждого теста, но это очень ресурсозатратно.
Гораздо эффективнее держать где-то готовые сессии и использовать в тесте уже открытую ранее сессию.
Для хранения и передачи сессии в тест нужно реализовывать какой-то механизм.
Далее, перед каждым тестом (`BeforeEach`) и в коде самого теста необходимо описать логику обращения
к этому объекту:

 - выбрать сессию с нужными параметрами
 - возможно, донастроить ее или открыть новую

Кроме того, необходимо учесть работу при многопоточном запуске.
А что если для каких-то тестов необходимы особые настройки?
Не будут ли эти настройки влиять на тесты, запущенные параллельно?

> Это достаточно большое количество логики, которое будет увеличивать код ваших тестов и снижать его читаемость.
{style="warning"}

Кроме того, если у вас тесты, которые проверяют сценарии работы с приложением,
то вам будут необходимы объекты, хранящие текущий контекст выполнения тестов и его "состояние".
Обычного "Stash", зачастую нехватает.
Пишутся свои системы хранения/получени данных. И для них актуальны все те же проблемы, связанные
с донастройкой на уровне `теста`/`тестового класса`/`группы тестов`/`потока`.

Еще одной проблемой является то, что в больших проектах используется большое количество различных
вспомогательных сущностей. И, когда команда тестировщиков большая,
то со временем теряется понимание, что для чего необходимо использовать.
Какие вспомогательные сущности необходимо инициализировать для какой проверки.
Зачастую, предпочитают инициализировать все сразу, а использовать то, что пригодится.
Такой подход значительно замедляет тесты, поскольку для каждого создаются сущности,
которые не всегда используются. А если сущности создаются в одном экземпляре
на многопоточные или последовательные запуски, то нужно предусмотреть, чтобы логика правильно работала
и для разных потоков и при некорректном завершении теста.

В e2e-тестах, часто используются фикстуры, которые необходимо выполнить перед тестом и откатить после.
Это еще один механизм, который помещается в логику `BeforeEach`/`AfterEach`. Однако, здесь сложность еще в том,
что для каждого теста в рамках тестового класса набор и настройка фикстур может отличаться.
И, получается, что в логике выполнения общего метода BeforeEach приходится предусматривать условия,
касающиеся конкретных тестов. Все это так же усложняет ваши тесты.

Библиотека `Environment` предоставляет решение для:

- выстраивания необходимого набора сущностей, используемого для каждого из тестов
- конфигурирования вспомогательных сущностей, используемых для `теста`/`тестового класса`/`потока`

How to start
------------
<tabs>
    <tab title="Gradle (kts)">
        <code-block lang="kotlin">testImplementation("io.perfeccionista.framework:environment:0.4.4-Beta")</code-block>
    </tab>
    <tab title="Gradle">
        <code-block lang="groovy">testImplementation 'io.perfeccionista.framework:environment:0.4.4-Beta'</code-block>
    </tab>
    <tab title="Maven">
        <code-block lang="xml"><![CDATA[
            <dependency>
                <group>io.perfeccionista.framework</group>
                <artifactId>environment</artifactId>
                <version>0.4.4-Beta</version>
                <scope>test</scope>
            </dependency>]]>
        </code-block>
    </tab>
</tabs>
